<html><head><meta charset="utf-8"><title>04 用思维导图拆解Spring Framework框架，让您事半功倍！-慕课专栏</title>
			<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
			<meta name="renderer" content="webkit">
			<meta property="qc:admins" content="77103107776157736375">
			<meta property="wb:webmaster" content="c4f857219bfae3cb">
			<meta http-equiv="Access-Control-Allow-Origin" content="*">
			<meta http-equiv="Cache-Control" content="no-transform ">
			<meta http-equiv="Cache-Control" content="no-siteapp">
			<link rel="apple-touch-icon" sizes="76x76" href="https://www.imooc.com/static/img/common/touch-icon-ipad.png">
			<link rel="apple-touch-icon" sizes="120x120" href="https://www.imooc.com/static/img/common/touch-icon-iphone-retina.png">
			<link rel="apple-touch-icon" sizes="152x152" href="https://www.imooc.com/static/img/common/touch-icon-ipad-retina.png">
			<link href="https://moco.imooc.com/captcha/style/captcha.min.css" rel="stylesheet">
			<link rel="stylesheet" href="https://www.imooc.com/static/moco/v1.0/dist/css/moco.min.css?t=201907021539" type="text/css">
			<link rel="stylesheet" href="https://www.imooc.com/static/lib/swiper/swiper-3.4.2.min.css?t=201907021539">
			<link rel="stylesheet" href="https://static.mukewang.com/static/css/??base.css,common/common-less.css?t=2.5,column/zhuanlanChapter-less.css?t=2.5,course/inc/course_tipoff-less.css?t=2.5?v=201907051055" type="text/css">
			<link charset="utf-8" rel="stylesheet" href="https://www.imooc.com/static/lib/ueditor/themes/imooc/css/ueditor.css?v=201907021539"><link rel="stylesheet" href="https://www.imooc.com/static/lib/baiduShare/api/css/share_style0_16.css?v=6aba13f0.css"></head>
			<body><div id="main">


<div class="main-con hide-menu">
    <!-- 左侧菜单 & 索引 -->
    
    <div class="right-content" style="padding-left: 0px;">
        <div class="container clearfix" id="top" style="width: 1134px; display: block;">
            
            
            <div class="center_con js-center_con l" style="width: 1134px;">
                <div class="article-con">
                                            <!-- 买过的阅读 -->
                        

                    
                    <div class="art-title" style="margin-top: 0px;">
                        04 用思维导图拆解Spring Framework框架，让您事半功倍！
                    </div>
                    <div class="art-info clearfix">
                        
                        <span class="l">
                            更新时间：2020-08-05 11:10:20
                        </span>
                    </div>
                    <div class="art-top">
                                                <img src="https://img3.sycdn.imooc.com/5ece090000010bda06400359.jpg" alt="">
                                                                        <div class="famous-word-box">
                            <img src="https://www.imooc.com/static/img/column/bg-l.png" alt="" class="bg1 bg">
                            <img src="https://www.imooc.com/static/img/column/bg-r.png" alt="" class="bg2 bg">
                            <div class="famous-word">合理安排时间，就等于节约时间。——培根<p></p></div>
                        </div>
                                            </div>
                    <div class="art-content js-lookimg">
                        <div id="article_content">
                            <div class="cl-preview-section"><h2 id="背景" style="font-size: 30px;">背景</h2>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">阅读源码绝对算得上是一件费时费力的工作，需要读者耗费大量的时间去完成。而作为开发人员，毕竟精力有限，实在没办法拿出太多的时间放在源码的阅读上。源码的复杂性。任何一款源码经历了多年的发展与提炼，其复杂程度可想而知。</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">当我们阅读源码的时候，大家都知道需要通过工具来跟踪代码的运行，如 <a href="https://www.sourceinsight.com/">SourceInsigh</a>、<a href="https://www.jetbrains.com/">IDEA</a>、<a href="https://www.eclipse.org/downloads/">Eclipse</a>、<a href="https://spring.io/tools">STS</a> 等，进而去分析程序。</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">但是，当代码过于复杂，环环相扣绕来绕去的时候，跟进了几十个甚至几百个类和方法时，这时我们已经不知道自己所处的位置了，不得不再重来，但是一次又一次地，最终发现自己根本无法驾驭它，不得不放弃。有些源码发展多年，会遇到各种各样的问题，并对问题进行了解决，而其中有些问题对于我们来说甚至可以用莫名其妙来修饰，有时候根本想不出会在什么情况下发生。我们查阅各种资料，查询无果后，会失去耐心，最终放弃。</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">无论基于什么样的原因，放弃阅读源码始终不是一个明智的选择，因为你失去了一个跟大师学习的机会。而且，当你读过几个源码之后就会发现，它们的思想以及实现方式是相通的。这就是开源的好处。随着各种开源软件的发展，各家都会融合别家优秀之处来不断完善自己，这样，到最后的结果就是所有的开源软件从设计上或者实现上都会变得越来越相似，也就是说当你读完某个优秀源码后再去读另一个源代码，阅读速度会有很大提升。</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">那为什么选择 Spring 的源码来作为阅读的首选呢？</p>
</div><div class="cl-preview-section"><ul>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>广泛性：</strong> Spring 使用的广泛性，使面试时，Spring 问题成为必选之一，而通过阅读代码理解 Spring 内部原理成为您脱颖而用的重要利器；</p>
</li>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>高质量代码：</strong> Spring 秉承的理念之一：高质量代码，使我们阅读代码的难度降低，适合当开发者写代码的范本。</p>
</li>
</ul>
</div><div class="cl-preview-section"><blockquote>
<p style="font-size: 20px; line-height: 38px;">Set high standards for code quality. The Spring Framework puts a strong emphasis on meaningful, current, and accurate javadoc. It is one of very few projects that can claim clean code structure with no circular dependencies between packages.</p>
</blockquote>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">阅读代码，最好对整个 Spring 框架有全面的认识，可以抓住主要的，想要深入的代码，重点攻关，下面这篇文章将 Spring 各个模块直接的依赖管理整理出思维导图，并抽象出两大部分，分别是核心基础组件和高级应用组件，帮忙你更好的掌握 Spring 框架本身。</p>
</div><div class="cl-preview-section"><h2 id="核心基础组件" style="font-size: 30px;">核心基础组件</h2>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">Spring 基础组件包含六个，相应的关系如下图：<br>
<img class="" src="https://img1.sycdn.imooc.com/5f28db83000139b212360588.png" data-original="//img1.sycdn.imooc.com/5f28db83000139b212360588.png" alt="图片描述"><br>
从箭头的流向可以归纳出从底到上的分层结构：</p>
</div><div class="cl-preview-section"><ul>
<li style="font-size: 20px; line-height: 38px;">spring-jcl、spring-instrument、kotlin-coroutines 是底层基础，不依赖 Spring；</li>
<li style="font-size: 20px; line-height: 38px;">其它组件，可以标记为 L1；</li>
<li style="font-size: 20px; line-height: 38px;">spring-core 依赖于 spring-jcl、kotlin-coroutines 而又不依赖其它 Spring 组件，可以标记为 L2；</li>
<li style="font-size: 20px; line-height: 38px;">spring-expression、spring-beans 依赖于 spring-jcl 和 spring-core 又不依赖其它 Spring 组件，可以标记为 L3；</li>
<li style="font-size: 20px; line-height: 38px;">spring-aop 依赖于 spring-jcl、spring-core、spring-beans 而又不依赖其它 Spring 组件，可以标记为 L4；</li>
<li style="font-size: 20px; line-height: 38px;">spring-context 依赖于 spring-jcl、spring-core、spring-expression、spring-beans、spring-aop，可标记为L5。</li>
</ul>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;"><img class="" src="https://img1.sycdn.imooc.com/5ecde6d90001860205310588.jpg" data-original="//img1.sycdn.imooc.com/5ecde6d90001860205310588.jpg" alt="图片描述"></p>
</div><div class="cl-preview-section"><ul>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>Spring-jcl：</strong> JCL 全称：Jakarta Commons Logging，Spring-jcl 采用了设计模式中的“适配器模式”，它对外提供统一的接口，然后在适配类中将对日志的操作委托给具体的日志框架；</p>
</li>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>Spring-core：</strong> Core 模块主要的功能是实现了反向控制 IOC（Inversion of Control）与依赖注入DI（Dependency Injection）、Bean 配置以及加载。Core 模块中有 Beans、BeanFactory、BeanDefinitions、ApplicationContext 等几个重要概念；</p>
</li>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>Spring-expression：</strong> Spring 表达式语言，解析 Spring 表达式语言；</p>
</li>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>Spring-beans：</strong>  负责 Bean 工厂中 Bean 的装配，所谓 Bean 工厂即是创建对象的工厂，Bean 的装配也就是对象的创建工作。<strong>重点：BeanFactory</strong>；</p>
</li>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>Spring-aop：</strong> Spring 提供了面向切面功能的模块；</p>
</li>
<li style="font-size: 20px; line-height: 38px;">
<p style="font-size: 20px; line-height: 38px;"><strong>Spring-context：</strong> Spring 的 IOC 容器，因大量调用 Spring Core 中的函数，整合了 Spring 的大部分功能。 Bean 创建好对象后，由 Context 负责建立 Bean 与 Bean 之间的关系并维护。所以也可以把 Context 看成是 Bean 关系的集合，<strong>重点：ApplicationContext</strong>。</p>
</li>
</ul>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">使用的其它组件：</p>
</div><div class="cl-preview-section"><ul>
<li style="font-size: 20px; line-height: 38px;"><strong>Spring-instrument：</strong> 相当于一个检测器，提供对 JVM 以及对 Tomcat 的检测；</li>
<li style="font-size: 20px; line-height: 38px;"><strong>kotlin-coroutines：</strong> 引入了协程。</li>
</ul>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">为了方便查看，我们去掉了 Spring 核心组件的描述，仅仅描述核心组件之间的关系，如下图所示：<br>
<img class="" src="https://img1.sycdn.imooc.com/5f28dc2c0001ebbc13090484.png" data-original="//img1.sycdn.imooc.com/5f28dc2c0001ebbc13090484.png" alt="图片描述"></p>
</div><div class="cl-preview-section"><h2 id="高级应用组件" style="font-size: 30px;">高级应用组件</h2>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">本文根据 Spring5.x 官方最新文档画出的 Spring 的架构图如下：</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;"><img class="" src="https://img1.sycdn.imooc.com/5ecde6b0000160ce12360803.png" data-original="//img1.sycdn.imooc.com/5ecde6b0000160ce12360803.png" alt="图片描述"><br>
可以看到 Spring 核心组件 core 位于所有组件的核心，它包含了 DI，事件，资源，国际化，验证，数据绑定，类型转换，SpEL，AOP 等主要功能，基于核心应用组件之上的组件有：数据访问（data access）、Web 框架、Spring 还支持动态脚本语言如 Groovy，也提供了 Kotlin 的支持、及其它各种框架及组件如调度，邮件，缓存，远程调用等的支持集成。最后，Spring 还提供了方便的测试支持 spring-test。</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">下面对各组件做一下详细介绍。</p>
</div><div class="cl-preview-section"><h3 id="web-框架">1. web 框架</h3>
</div><div class="cl-preview-section"><ul>
<li style="font-size: 20px; line-height: 38px;"><strong>Spring-web：</strong> Web 上下文模块建立在应用程序上下文模块之上，为基于 Web 的应用程序提供了上下文；</li>
<li style="font-size: 20px; line-height: 38px;"><strong>Spring-webmvc：</strong> 主要用于在遵守 Servlet 规范的前提下，将 Spring 框架集成到 Java web 应用中；</li>
<li style="font-size: 20px; line-height: 38px;"><strong>Spring-websocket</strong>：Spring 在 4.0 后将 WebSocket 集成了进去，即 Spring-websocket 模块。它与 Java WebSocket API 标准（JSR-356）兼容，并且还提供额外功能；</li>
<li style="font-size: 20px; line-height: 38px;"><strong>Spring-webflux：</strong> Spring Framework 5.0 中引入的新的反应式 Web 框架。 与 Spring MVC 不同，它不需要 Servlet API，完全异步和非阻塞， 并通过 Reactor 项目实现 Reactive Streams 规范。 并且可以在诸如 Netty， Undertow 和 Servlet 3.1+ 容器的服务器上运行。</li>
</ul>
</div><div class="cl-preview-section"><h3 id="数据访问">2. 数据访问</h3>
</div><div class="cl-preview-section"><ul>
<li style="font-size: 20px; line-height: 38px;"><strong>Transactions：</strong> 事务管理</li>
<li style="font-size: 20px; line-height: 38px;"><strong>DAO Support：</strong> 数据访问对象</li>
<li style="font-size: 20px; line-height: 38px;"><strong>JDBC：</strong> jdbcTemplate</li>
<li style="font-size: 20px; line-height: 38px;"><strong>O/R Mapping：</strong> jpa，hibernate</li>
<li style="font-size: 20px; line-height: 38px;"><strong>XML Marshalling：</strong> xml 读取</li>
</ul>
</div><div class="cl-preview-section"><h3 id="消息框架">3.消息框架</h3>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">Spring-messaging</p>
</div><div class="cl-preview-section"><h3 id="高级组件的关系">高级组件的关系</h3>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">我们看一下他们之间的相互关系，完整的依赖图如下所示：<br>
<img class="" src="https://img1.sycdn.imooc.com/5f28dc7d0001248515890824.png" data-original="//img1.sycdn.imooc.com/5f28dc7d0001248515890824.png" alt="图片描述"></p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">从图中可以看出来各组件以下依赖关系：</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">spring-web 依赖于 Spring 核心组件和 spring-oxm；</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">spring-webmvc 依赖于 Spring核心组件和 spring-web，spring-context-support，spring-oxm；</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">spring-websocket 依赖于 Spring 核心组件和 spring message，spring-web，spring-webmvc；</p>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">spring-webflux 依赖于 Spring 核心组件和 spring-context-support，kotlin-coroutines。</p>
</div><div class="cl-preview-section"><h2 id="总结" style="font-size: 30px;">总结</h2>
</div><div class="cl-preview-section"><p style="font-size: 20px; line-height: 38px;">Spring 框架本身包含的内容比较多，盲目的去阅读其源代码，只会陷入代码的沼泽中；源码 Spring 源码讲解战略战术：从战略上搞清楚 Spring 的各个组件及应用场景，然后从战术上根据自己的弱点进行加强练习，才可以练就一身神功。官方文档是我们了解 Spring 框架组件及应用场景的最好来源，通过使用思维导图来将官网文档进行浓缩精华，是一种值得推荐的方式。你瞧！你是否对 Spring 框架有了总体的认识了？</p>
</div>}
                        </div>
                    </div>
                                            <!-- 买过的阅读 -->
                        <div class="art-next-prev clearfix">
                                                                                                <!-- 已买且开放 或者可以试读 -->
                                    <a href="/read/77/article/2014">
                                                                    <div class="prev l clearfix">
                                        <div class="icon l">
                                            <i class="imv2-arrow3_l"></i>
                                        </div>
                                        <p>
                                            03 深入Spring5 的原理或者源码的道和术
                                        </p>
                                    </div>
                                </a>
                                                                                                                            <!-- 已买且开放 或者可以试读 -->
                                    <a href="/read/77/article/2018">
                                                                    <div class="next r clearfix">
                                        <p>
                                            05 Spring 5.x特性、设计理念及架构
                                        </p>
                                        <div class="icon r">
                                            <i class="imv2-arrow3_r"></i>
                                        </div>

                                    </div>
                                </a>
                                                    </div>
                                    </div>
                <div class="comments-con js-comments-con" id="coments_con">
                </div>

                
            </div>
            
            
            

        </div>
    </div>
</div>

<div class="modal modal-jiaQun-new hide" id="modal-jiaQun">
    <div class="inner" style="">
        <div class="modal-close js-close-jiaQun">
            <i class="imv2-close"></i>
        </div>
        <div class="content">
            <img src="https://img1.sycdn.imooc.com/5f1a80010001c9a105340522.jpg">
            <div class="right-info">
                <div class="title">
                    扫码加入慕课Java核心用户群
                </div>
                <div class="desc">
                                            <p class="mb6">验证信息：<span id="joincode">2011161431052393</span><span class="copy js-copy-joincode">复制</span></p>
                                        <p class="mb6">QQ讨论群号：314316732</p>
                                            <p>QQ群URL：<a href="https://jq.qq.com/?_wv=1027&amp;k=OouwHZGZ" target="_blank">点击访问</a></p>
                                    </div>
            </div>
            <p class="tip">若遇到搜索不到QQ群或加群失败，请联系客服邮箱:kf@imooc.com</p>
        </div>
    </div>
</div>
 
<!-- 专栏介绍页专栏评价 -->

<!-- 专栏介绍页底部三条评价 -->

<!-- 专栏阅读页弹层目录和介绍页页面目录 -->

<!-- 专栏阅读页发布回复 -->

<!-- 专栏阅读页发布评论 -->

<!-- 专栏阅读页底部评论 -->

<!-- 专栏阅读 单个 评论 -->

<!-- 新增回复和展开三条以外回复 -->

<!-- 立即订阅的弹窗 -->












</div></body></html>